﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Collections;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Microsoft.Reporting.WebForms;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.IO;

namespace Dragon
{
    public partial class wfUploadFile : System.Web.UI.Page
    {
        DataService ds = new DataService();

        protected void Page_Load(object sender, EventArgs e)
        {
            //List<string> roles = new List<string> { "All" };
            //if (Session["Username"] == null || roles.Contains(Session["UserType"].ToString()) == false)
            //{
            //    Response.Redirect("~/wfLogin.aspx");
            //}

            if (!IsPostBack)
            {
                ShowInitInformation();
            }
        }

        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            ShowInitInformation();
        }

        private void ShowInitInformation()
        {
            string sql;
            DataTable dt;
            DateTime lastDate;
            switch (this.ddlType.SelectedIndex)
            {
                case 0:
                    this.lblInformation.Text = "Export toàn bộ danh sách điểm bán trên SMS để upload";
                    break;
                case 1:
                    this.lblInformation.Text = "Export toàn bộ danh sách nhân viên trên SMS để upload";
                    break;
                case 2:
                    sql = "select max(selldate) from sms";
                    dt = ds.GetData(sql);
                    if (dt.Rows[0][0].ToString() != "")
                    {
                        lastDate = Convert.ToDateTime(dt.Rows[0][0].ToString());
                        this.lblInformation.Text = "Dữ liệu cuối cùng được upload lên hệ thống của ngày " + lastDate.ToString("dd/MM/yyyy");
                    }
                    else
                        this.lblInformation.Text = "Chưa có dữ liệu trên hệ thống";
                    break;
                case 3:
                    sql = "select max(selldate) from smssellin";
                    dt = ds.GetData(sql);
                    if (dt.Rows[0][0].ToString() != "")
                    {
                        lastDate = Convert.ToDateTime(dt.Rows[0][0].ToString());
                        this.lblInformation.Text = "Dữ liệu cuối cùng được upload lên hệ thống của ngày " + lastDate.ToString("dd/MM/yyyy");
                    }
                    else
                        this.lblInformation.Text = "Chưa có dữ liệu trên hệ thống";
                    break;
                case 4:
                    this.lblInformation.Text = "Export toàn bộ danh sách vùng trên Dragon để upload";
                    break;
                case 5:
                    this.lblInformation.Text = "Export toàn bộ danh sách người dùng trên Dragon để upload";
                    break;
                case 6:
                    this.lblInformation.Text = "Export toàn bộ danh sách điểm bán trên Dragon để upload";                    
                    break;
                case 7:
                    sql = "select max(StartTime) from Visit";
                    dt = ds.GetData(sql);
                    if (dt.Rows[0][0].ToString() != "")
                    {
                        lastDate = Convert.ToDateTime(dt.Rows[0][0].ToString());
                        this.lblInformation.Text = "Dữ liệu cuối cùng được upload lên hệ thống của ngày " + lastDate.ToString("dd/MM/yyyy");
                    }
                    else
                        this.lblInformation.Text = "Chưa có dữ liệu trên hệ thống";
                    break;
                case 8:
                    this.lblInformation.Text = "Export toàn bộ dữ liệu vị trí trong database để upload";
                    break;
                case 9:
                    this.lblInformation.Text = "Export toàn bộ dữ liệu kế hoạch trong database để upload";
                    break;
            }
        }

        protected void btnUpload_Click(object sender, EventArgs e)
        {
            switch (this.ddlType.SelectedIndex)
            {
                case 0:
                    UploadData("SMSCustomer");
                    break;
                case 1:
                    UploadData("BA");
                    break;
                case 2:
                    UploadData("SMS");
                    break;
                case 3:
                    UploadData("SMSSellIn");
                    break;
                case 4:
                    UploadData("Region");
                    break;
                case 5:
                    UploadData("User");
                    break;
                case 6:
                    UploadData("Customer");
                    break;
                case 7:
                    UploadData("Visit");
                    break;
                case 8:
                    UploadData("Location");
                    break;
                case 9:
                    UploadData("Routing");
                    break;
            }
        }

        private void UploadData(string data)
        {
            if (this.FileUpload1.HasFile)
            {
                try
                {
                    //Upload file vao thu muc tren server
                    string fileName = Path.GetFileName(FileUpload1.FileName);
                    string filePath = Server.MapPath("~/UploadFiles/") + fileName;
                    FileUpload1.SaveAs(filePath);

                    //Xoa du lieu cu o RawData
                    string sql = "delete from " + data + "RawData";
                    if (data == "Routing")
                        sql = "delete from VisitDef";
                    ds.SetData(sql);

                    //Them du lieu moi vao RawData
                    if (data == "SMSCustomer")
                    {
                        sql = "insert into SMSCustomerRawData (F2, F3, F4, F5, F6, F8, F9, F10) SELECT F2, F3, F4, F5, F6, F8, F9, F10 "
                           + "FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + filePath + "', 'select * from [DsCuaHang$]')";
                    }
                    else if (data == "BA")
                    {
                        sql = "insert into BARawData (F2, F3, F4, F5, F6, F7, F8, F10, F12) SELECT F2, F3, F4, F5, F6, F7, F8, F10, F12 "
                           + "FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + filePath + "', 'select * from [dsExcel$]')";
                    }
                    else if (data == "SMS")
                    {
                        sql = "insert into SMSRawData (SellDate, SMSDate, BACode, CustomerCode, CustomerDragonCode, BAS, ProductSMSCode, Quantity, Approved) "
                             + "SELECT [Báo cáo số liệu Sale-out], F2, F3, F6, F8, F11, F12, F13, F14 "
                             + "FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + filePath + "', 'select * from [Carslberg$]')";
                    }
                    else if (data == "SMSSellIn")
                    {
                        sql = "insert into SMSSellInRawData (F2, F3, F5, F6, F7, F10, F11, F12, F13) SELECT F2, F3, F5, F6, F7, F10, F11, F12, F13 "
                           + "FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + filePath + "', 'select * from [dsExcel$]')";
                    }
                    else if (data == "Region")
                    {
                        sql = "insert into RegionRawData ([Status], [Region Code], [Region Name], [Region Type], [Hierarchy]) "
                            + "SELECT [Status], [Region Code], [Region Name], [Region Type], [Hierarchy] "
                            + "FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + filePath + "', 'select * from [Sheet$]')";
                    }
                    else if (data == "User")
                    {
                        sql = "insert into UserRawData ([Status], Code, [User name], [First name], [Last name], Region) "
                            + "SELECT [Status], Code, [User name], [First name], [Last name], Region "
                            + "FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + filePath + "', 'select * from [Sheet$]')";
                    }
                    else if (data == "Customer")
                    {
                        sql = "insert into CustomerRawData ([Status], [Distributor Name], [Name], [Channel], [Customer Code], [Address], [DSR], [CVTC SR], [PGL]) "
                            + "SELECT [Status], [Distributor Name], [Name], [Channel], [Customer Code], [Address], [DSR], [CVTC SR], [PGL] "
                            + "FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + filePath + "', 'select * from [Sheet$]')";
                    }
                    else if (data == "Visit")
                    {
                        sql = "insert into VisitRawData ([Region], [User], [Customer], [Start], [End], [Distance (m)]) "
                           + "SELECT [Region], [User], [Customer], [Start], [End], [Distance (m)] "
                           + "FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + filePath + "', 'select * from [Sheet$]')";
                    }
                    else if (data == "Location")
                    {
                        sql = "insert into LocationRawData ([cdStore], [dsLongitude], [dsLatitude]) "
                           + "SELECT [cdStore], [dsLongitude], [dsLatitude] "
                           + "FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + filePath + "', 'select * from [Sheet1$]')";
                    }
                    else if (data == "Routing")
                    {
                        sql = "insert into VisitDef ([VisitDefCode], [RegionCode], [CustomerTempCode], [VisitOrder], [RecurrenceType], [Interval], "
                           + "[DayOfMonth], [MonthOfYear], [WeekDaysMask], [WeekDayInstance], [RecurrenceStartDate], [RecurrenceEndDate]) "
                           + "SELECT idVisitDef, cdRegion, cdStore, nrDefaultVisitOrder, nrRecurrenceType, nrInterval, nrDayOfMonth, "
                           + "nrMonthOfYear, nrWeekDaysMask, nrWeekDayInstance, dtRecurrenceStartDate, dtRecurrenceEndDate "
                           + "FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + filePath + "', 'select * from [Sheet1$]')";
                    }
                    ds.SetData(sql);

                    //Dem so dong vua them vao RawData
                    sql = "select count(1) from " + data + "RawData";
                    if (data == "Routing")
                        sql = "select count(1) from VisitDef";

                    DataTable dt = ds.GetData(sql);
                    int RawDataRowsNumber1 = Convert.ToInt32(dt.Rows[0][0].ToString());

                    //Them du lieu vao bang data tuong ung
                    sql = "exec sp_Import_" + data;
                    ds.SetData(sql);

                    //Dem so dong sau khi xu ly
                    sql = "select count(1) from " + data + "RawData";
                    if (data == "Routing")
                        sql = "select count(1) from VisitDef where Failed = 1";

                    dt = ds.GetData(sql);
                    int RawDataRowsNumber2 = Convert.ToInt32(dt.Rows[0][0].ToString());

                    //Xoa file da upload len server va thong bao
                    File.Delete(filePath);
                    this.lblInformation.Text = "Upload: <b>" + RawDataRowsNumber1 + "</b> dòng, xử lý thành công: <b>"
                        + (RawDataRowsNumber1 - RawDataRowsNumber2) + "</b> dòng, còn lại: <b>" + RawDataRowsNumber2 + "</b> dòng.";
                }
                catch(Exception ex)
                {
                    this.lblInformation.Text = "Có lỗi trong quá trình xử lý file. Vui lòng thử lại!";
                    return;
                }
            }
        }             
    }
}